#!/bin/bash

# 服务器启动脚本
# 用法: ./start.sh [后缀]

set -e  # 遇到错误退出

# 配置参数
CONFIG_SUFFIX="$1"
SERVICE_NAME="server"  # 服务名称变量
DEFAULT_SERVER_BIN="./bin/$SERVICE_NAME"
DEFAULT_PID_DIR="./pid"
DEFAULT_BIN_DIR="./bin"
DEFAULT_CONFIG_FILE="${SERVICE_NAME}.toml"  # 配置文件在当前目录
LOG_BACKUP_DIR="./backup"  # 日志备份目录

# 检查默认服务器二进制文件
if [ ! -f "$DEFAULT_SERVER_BIN" ]; then
    echo "❌ 错误: 默认服务器可执行文件不存在: $DEFAULT_SERVER_BIN"
    exit 1
fi

# 根据后缀构建文件路径
if [ -z "$CONFIG_SUFFIX" ]; then
    SERVER_BIN="$DEFAULT_SERVER_BIN"
    PID_FILE="$DEFAULT_PID_DIR/${SERVICE_NAME}.pid"
    LOG_FILE="nohup_${SERVICE_NAME}.log"  # 日志文件在当前目录，加nohup前缀
    CONFIG_FILE="$DEFAULT_CONFIG_FILE"    # 配置文件在当前目录
    echo "ℹ️ 使用默认配置启动服务器"
else
    SERVER_BIN="${DEFAULT_BIN_DIR}/${SERVICE_NAME}_${CONFIG_SUFFIX}"
    PID_FILE="$DEFAULT_PID_DIR/${SERVICE_NAME}_${CONFIG_SUFFIX}.pid"
    LOG_FILE="nohup_${SERVICE_NAME}_${CONFIG_SUFFIX}.log"  # 日志文件在当前目录，加nohup前缀
    CONFIG_FILE="${SERVICE_NAME}_${CONFIG_SUFFIX}.toml"    # 配置文件在当前目录
    echo "ℹ️ 使用后缀 '${CONFIG_SUFFIX}' 启动服务器"

    # 检查对应的配置文件是否存在
    if [ ! -f "$CONFIG_FILE" ]; then
        echo "❌ 错误: 配置文件不存在: $CONFIG_FILE"
        echo "   请创建对应的配置文件或使用不同的后缀"
        exit 1
    fi
    echo "✅ 找到配置文件: $CONFIG_FILE"

    # 强制复制默认二进制文件创建带后缀的版本（总是覆盖）
    echo "📋 复制二进制文件: $DEFAULT_SERVER_BIN -> $SERVER_BIN"
    cp -f "$DEFAULT_SERVER_BIN" "$SERVER_BIN"
    chmod +x "$SERVER_BIN"
    echo "✅ 已创建/更新带后缀的二进制文件"
fi

# 检查配置文件是否存在（对于默认配置也检查）
if [ ! -f "$CONFIG_FILE" ]; then
    echo "❌ 错误: 配置文件不存在: $CONFIG_FILE"
    exit 1
fi

# 检查服务器二进制文件是否可执行
if [ ! -x "$SERVER_BIN" ]; then
    echo "⚠️ 警告: 服务器文件不可执行，添加执行权限"
    chmod +x "$SERVER_BIN"
fi

# 创建必要的目录
mkdir -p "$DEFAULT_PID_DIR"
mkdir -p "$LOG_BACKUP_DIR"

# 获取当前日期
CURRENT_DATE=$(date +"%Y%m%d")

# 根据后缀构建备份文件名
if [ -z "$CONFIG_SUFFIX" ]; then
    BACKUP_FILENAME="${SERVICE_NAME}_${CURRENT_DATE}.log"
else
    BACKUP_FILENAME="${SERVICE_NAME}_${CONFIG_SUFFIX}_${CURRENT_DATE}.log"
fi
BACKUP_PATH="$LOG_BACKUP_DIR/$BACKUP_FILENAME"

# 备份现有日志文件（如果存在且不为空）
if [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then
    echo "📦 备份日志到每日文件: $BACKUP_FILENAME"

    # 添加分隔符和备份时间信息
    echo "" >> "$BACKUP_PATH"
    echo "=== 备份时间: $(date +"%Y-%m-%d %H:%M:%S") ===" >> "$BACKUP_PATH"
    echo "=== 源文件: $LOG_FILE ===" >> "$BACKUP_PATH"
    echo "" >> "$BACKUP_PATH"

    # 追加日志内容到备份文件
    cat "$LOG_FILE" >> "$BACKUP_PATH"

    echo "✅ 日志已追加到每日备份文件: $BACKUP_PATH"

    # 清空当前日志文件以便新的启动记录
    true > "$LOG_FILE"
    echo "🗑️  已清空当前日志文件，准备记录新的启动日志"
else
    echo "ℹ️ 没有找到现有的日志文件或文件为空，无需备份"
fi

# 启动服务器
echo "🚀 启动程序: $SERVER_BIN"
echo "📝 日志文件: $LOG_FILE"
echo "📦 每日备份文件: $BACKUP_PATH"
echo "🔖 PID文件: $PID_FILE"
echo "⚙️ 配置文件: $CONFIG_FILE"

# 添加启动信息到日志文件
echo "=== 服务器启动于: $(date +"%Y-%m-%d %H:%M:%S") ===" >> "$LOG_FILE"
echo "=== 启动命令: $SERVER_BIN --config $CONFIG_FILE ===" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# 启动服务器
nohup "$SERVER_BIN" --config "$CONFIG_FILE" >> "$LOG_FILE" 2>&1 &

# 获取启动的进程PID
STARTED_PID=$!
echo "✅ 服务器进程已启动，PID: $STARTED_PID"

# 等待一段时间，让程序有机会创建PID文件
echo "⏳ 等待程序初始化..."
sleep 3

# 检查程序是否自己创建了PID文件
if [ -f "$PID_FILE" ]; then
    PROGRAM_PID=$(cat "$PID_FILE" 2>/dev/null)

    # 验证PID文件内容是否为数字
    if ! echo "$PROGRAM_PID" | grep -qE '^[0-9]+$'; then
        echo "⚠️ 程序创建的PID文件内容格式错误，由脚本重新创建"
        echo "$STARTED_PID" > "$PID_FILE"
        FINAL_PID="$STARTED_PID"
        echo "✅ 脚本已创建PID文件: $STARTED_PID"

    # 检查PID是否与脚本启动的PID一致
    elif [ "$PROGRAM_PID" -eq "$STARTED_PID" ]; then
        echo "✅ 程序已成功创建PID文件，与启动PID一致"
        FINAL_PID="$STARTED_PID"

    else
        echo "⚠️ 程序报告的PID($PROGRAM_PID)与启动PID($STARTED_PID)不一致"

        # 检查程序报告的PID是否在运行
        if kill -0 "$PROGRAM_PID" 2>/dev/null; then
            echo "✅ 程序报告的PID正在运行，使用程序PID"
            FINAL_PID="$PROGRAM_PID"
        else
            echo "⚠️ 程序报告的PID不在运行，使用启动PID并由脚本更新PID文件"
            echo "$STARTED_PID" > "$PID_FILE"
            FINAL_PID="$STARTED_PID"
            echo "✅ 脚本已更新PID文件: $STARTED_PID"
        fi
    fi
else
    echo "⚠️  程序没有创建PID文件，由脚本创建"
    echo "$STARTED_PID" > "$PID_FILE"
    FINAL_PID="$STARTED_PID"
    echo "✅ 脚本已创建PID文件: $STARTED_PID"
fi

# 等待片刻确认启动成功
sleep 2

# 最终检查进程状态
if kill -0 "$FINAL_PID" 2>/dev/null; then
    echo "✅ 服务器启动成功!"
    echo "   PID: $FINAL_PID"
    echo "   使用命令停止服务: ./stop.sh $CONFIG_SUFFIX"

    # 显示最新的日志内容（最后10行）
    echo ""
    echo "📋 显示最新日志内容（最后50行）:"
    echo "=========================================="
    if [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then
        tail -50 "$LOG_FILE"
    else
        echo "日志文件为空或不存在"
    fi
    echo "=========================================="
    echo ""
    echo "实时查看日志: tail -f $LOG_FILE"
    echo "查看完整日志: cat $LOG_FILE"
    echo "查看今日备份: cat $BACKUP_PATH"
    echo "列出所有备份: ls -la $LOG_BACKUP_DIR/"

else
    echo "❌ 服务器启动失败!"
    echo "   请检查日志文件: $LOG_FILE"

    # 显示失败时的日志内容
    echo ""
    echo "📋 显示日志内容:"
    echo "=========================================="
    if [ -f "$LOG_FILE" ]; then
        cat "$LOG_FILE"
    else
        echo "日志文件不存在"
    fi
    echo "=========================================="

    rm -f "$PID_FILE" 2>/dev/null
    exit 1
fi